//
//  SFMovableGroupAndItemTableViewCell.h
//  DMP
//
//  Created by 支晓辉 on 16/4/8.
//  Copyright © 2016年 Lxit. All rights reserved.
//

#import "SFMovableTableViewCell.h"
#import "SFGroupItem.h"
#import "SFGroup.h"
#import "SFMovableView.h"

@class SFMovableGroupAndItemTableViewController;

#define MOVABLE_VIEW SFMovableView

/**
 *  可移动视图的重用机制代理
 */
@protocol SFMovableItemViewDequeueDelegate <NSObject>

@required

/**
 *  使用缓存列表里的视图
 */
- (__kindof MOVABLE_VIEW*)dequeueWithMovableViewIdentifier:(NSString*)identifier;

/**
 *  注册一个NIB为重用视图
 */
- (void)registNib:(UINib*)nib movableViewIdentifier:(NSString*)identifier;

/**
 *  注册一个类的视图为重用视图
 */
- (void)registClass:(Class)viewClass movableViewIdentifier:(NSString*)identifier;

/**
 *  设置移动视图不可用
 */
- (void)unuseWithMovableView:(MOVABLE_VIEW*)movableView;

@end

@interface SFMovableGroupAndItemTableViewCell : SFMovableTableViewCell
/** 对应的子组数据 */
@property (strong, nonatomic) SFGroup *groupData;
/** 不使用子视图的分割线 */
@property (assign, nonatomic) BOOL notUseSepLine;
/** 当前存放子内容视图的高度 */
@property (nonatomic, readonly) CGFloat bodyViewHeight;
/** 当前存放子内容的视图的透明度 */
@property (assign, nonatomic) CGFloat bodyViewAlpha;
/** 是否展开的图片视图 */
@property (weak, nonatomic) IBOutlet UIImageView *expandedImageView;
/** 标题占位视图(用于响应cell的拖动事件) */
@property (weak,nonatomic) IBOutlet UIView *titleSpanView;
/** 内容视图是否为空 */
@property (nonatomic, readonly) BOOL bodyViewIsEmpty;
/** 子行初始化宽度 */
@property (assign, nonatomic) CGFloat subRowInitWidth;
/** 单项视图的重用ID */
@property (strong, nonatomic) NSString *itemViewReuseIdentifier;
/** 移动视图的缓存视图处理代理 */
@property (weak, nonatomic) id<SFMovableItemViewDequeueDelegate> dequeueDelegate;

#pragma mark - Static methods
#pragma mark -

/**
 *  用于计算当前cell的高度
 *
 *  @param group cell的数据模型
 *
 */
+ (CGFloat)calcRowHeightWithGroup:(SFGroup*)group;

/**
 *  分割线的高度(不希望自动生成分割线的话这里可以设成0)
 */
+ (CGFloat)sepLineHeight;

#pragma mark - Instance methods
#pragma mark -

/**
 *  更新每行的子视图
 */
- (void)updateChildren;

/**
 *  重新加载子项视图
 *
 *  @param index 子项所在索引
 */
- (void)reloadRowAtIndex:(NSUInteger)index;

#pragma mark - Need to override

/**
 *  创建可拖拽移动子视图
 *
 *  @param index 所以索引
 *  @param item  对应的数据
 *
 */
- (MOVABLE_VIEW *)createMovableViewAtIndex:(NSInteger)index item:(SFGroupItem*)item;

#pragma mark - Layout

/**
 *  更新子视图的布局
 *
 *  @param animated 是否动画更新
 */
- (void)updateChildrenLayoutWithAnimation:(BOOL)animated;

/**
 *  更新子视图的布局
 *  @param animated         是否动画执行
 *  @param otherAnimation   其它动画的block
 *  @param completeBlock    动画完成的时候调用的方法( <b>只有动画为<u>YES</u>才有效</b> )
 */
- (void)updateChildrenLayoutWithAnimation:(BOOL)animated otherAnimation:(void (^)())otherAnimation complete:(void (^)(BOOL finished))completeBlock;

#pragma mark - Movable view

#pragma mark Control

/**
 *  插入一个新的数据
 *
 *  @param index            插入到的索引
 *  @param item             插入的数据模型
 *  @param animated         是否动画插入
 *  @param completeBlock    完成之后执行
 */
- (void)insertDataAt:(NSInteger)index data:(SFGroupItem*)item animated:(BOOL)animated complete:(void (^)())completeBlock;

/**
 *  移动一行的数据的位置
 *
 *  @param srcIndex         开始移动的索引
 *  @param destIndex        移动到的目标位置的索引
 *  @param animated         是否动画移动
 *  @param completeBlock    完成之后执行
 */
- (void)moveDataFrom:(NSInteger)srcIndex to:(NSInteger)destIndex animated:(BOOL)animated complete:(void (^)())completeBlock;

/**
 *  删除某一行的数据
 *
 *  @param index    要删除的目的行索引
 *  @param animated 是否动画删除
 */
- (void)deleteDataAt:(NSInteger)index animated:(BOOL)animated;

#pragma mark Check intersection rect

/**
 *  获取当前外部rect是否跟本视图内的行数据相交，相交的话则返回索引，否则返回-1
 *
 *  @param screenRect 需要对比的rect
 *  @param item       需要过滤掉的item
 *
 */
- (NSInteger)intersectMovableViewRectWith:(CGRect)screenRect filterItem:(SFGroupItem*)item;

#pragma mark Get row view

/**
 *  获取当前视图中目标索引的视图
 *
 *  @param index 目标索引
 *
 *  @return 没有的时候返回nil
 */
- (MOVABLE_VIEW *)movableViewAtIndex:(NSInteger)index;

/**
 *  通过点获取点触碰到的视图
 *
 *  @param pt 必须为相对于keyWindow的坐标
 *
 *  @return 没有触碰到任何目标视图的话会返回nil
 */
- (MOVABLE_VIEW *)getMovableViewByPoint:(CGPoint)pt;

@end
